#include <sdk.h>
#include <editorbase.h>
#include <configurationpanel.h>
#include "permissions_preserver.h"


namespace
{
    PluginRegistrant<PermissionsPreserver> reg(_T("PermissionsPreserver"));
}



// constructor
PermissionsPreserver::PermissionsPreserver() {
   
   
   
    if(!Manager::LoadResource(_T("PermissionsPreserver.zip")))
    {
        NotifyMissingFile(_T("PermissionsPreserver.zip"));
    }
}

// destructor
PermissionsPreserver::~PermissionsPreserver() {
}

void PermissionsPreserver::OnAttach() {
   
   
   
   
   
   

   
    Manager* pm = Manager::Get();
    pm->RegisterEventSink(cbEVT_EDITOR_BEFORE_SAVE, new cbEventFunctor<PermissionsPreserver, CodeBlocksEvent>(this, &PermissionsPreserver::OnEditorBeforeSave));
    pm->RegisterEventSink(cbEVT_EDITOR_SAVE, new cbEventFunctor<PermissionsPreserver, CodeBlocksEvent>(this, &PermissionsPreserver::OnEditorSave));

}

void PermissionsPreserver::OnRelease(bool appShutDown) {
   
   
   
   
   
}

void PermissionsPreserver::OnEditorBeforeSave(CodeBlocksEvent& event) {
    EditorBase *ed = event.GetEditor();
    m_filename = ed->GetFilename();
    struct stat s;
    if (stat(m_filename.mb_str(wxConvUTF8),&s) == 0)
        m_permissions = s.st_mode;
    else
    {
        m_permissions = 0;
        m_filename = wxEmptyString;
    }
    event.Skip();
}

void PermissionsPreserver::OnEditorSave(CodeBlocksEvent& event) {
    EditorBase *ed = event.GetEditor();
    wxString filename = ed->GetFilename();
   
   
    if (filename == m_filename)
        chmod(m_filename.mb_str(wxConvUTF8),m_permissions);
    event.Skip();
}

